import helmet from 'helmet'
import { ConfigService } from '@nestjs/config'
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
import { ConfigEnum, WinstonModule } from './common'

/**
 * 应用启动的入口函数
 * 异步函数，负责创建 NestJS 应用实例、配置应用并启动服务
 */
async function bootstrap() {
  // 创建 NestJS 应用实例，传入根模块 AppModule
  // NestFactory.create() 会初始化依赖注入系统并加载所有模块
  const app = await NestFactory.create(AppModule, { logger: WinstonModule.createLogger() })

  // 使用 helmet 中间件增强应用安全性
  // helmet 会自动设置一系列 HTTP 头（如 Content-Security-Policy、X-XSS-Protection 等）
  // 帮助防御 XSS、点击劫持等常见的网络攻击
  app.use(helmet())

  // 从应用容器中获取配置服务实例
  // 由于 ConfigModule 被设置为全局模块，这里可以直接获取
  const configService = app.get(ConfigService)

  // 从配置中获取服务器相关配置
  // 使用非空断言运算符 (!) 表示确信该配置一定存在
  // 配置类型为之前定义的 NestConfig.Server 接口，确保类型安全
  const config = configService.get<NestConfig.Server>(ConfigEnum.SERVER)!

  // 设置全局路由前缀
  // 所有接口路径都会自动添加该前缀，便于 API 版本管理或路径区分
  // 例如：前缀为 '/api' 时，控制器中的 '/users' 会映射为 '/api/users'
  app.setGlobalPrefix(config.globalPrefix)

  // 启动应用并监听配置中指定的端口
  // 这一步会启动 HTTP 服务器，使应用开始接收外部请求
  await app.listen(config.port)

  // 打印服务启动信息，方便开发者在终端查看访问地址
  console.log('\n--------------------------------------------------')
  console.log(`➜  Local:    http://localhost:${config.port}${config.globalPrefix}`)
}

// 调用启动函数，启动应用
bootstrap()
